package com.hao.study.controller;

import com.hao.study.common.APIResponse;
import com.hao.study.common.ResponeCode;
import com.hao.study.entity.VisitData;
import com.hao.study.mapper.OverviewMapper;
import com.hao.study.mapper.ThingMapper;
import com.sun.management.OperatingSystemMXBean;
import io.swagger.annotations.Api;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.management.ManagementFactory;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * 控制器类，负责处理与系统概览相关的HTTP请求。
 */
@Api(tags={"系统信息及统计信息管理接口"})
@RestController
@RequestMapping("/overview")

public class OverViewController {
    @Autowired
    ThingMapper thingMapper;


    @Autowired
    OverviewMapper overviewMapper;

    @GetMapping("/sysInfo")
    public APIResponse sysInfo(){
        //获取系统信息
        Map<String,String> map=new HashMap<>();
        map.put("sysName","后台系统");
        map.put("versionName","1.0");
        map.put("processor","2");
        map.put("sysLan","En");
        map.put("sysZone","东八区");
//        OperatingSystemMXBean用来获取系统信息的工具
        /***
         * ManagementFactory.getOperatingSystemMXBean(); 是Java管理扩展（Java Management Extensions, JMX）框架中用来获取操作系统管理 bean（MXBean）的一个方法。这个方法属于 java.lang.management.ManagementFactory 类，它提供了访问Java虚拟机（JVM）和操作系统运行时信息的入口。
         * 调用 ManagementFactory.getOperatingSystemMXBean(); 会返回一个实现了 OperatingSystemMXBean 接口的对象。这个接口定义了一系列方法，允许你监测和管理操作系统的状态，包括但不限于：
         * 获取操作系统名称 (getName())
         * 获取操作系统架构 (getArch())
         * 获取操作系统的版本 (getVersion())
         * 获取可用的物理内存总量 (getTotalPhysicalMemorySize())
         * 获取空闲的物理内存总量 (getFreePhysicalMemorySize())
         * 获取已使用的CPU时间百分比 (getProcessCpuLoad() 或 getSystemCpuLoad()，具体取决于你关心的是JVM进程的CPU使用率还是整个系统的)
         */
        // 获取操作系统的MXBean实例，用于获取操作系统相关信息
        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
        // 获取操作系统的架构
        map.put("pf",osmxb.getArch());
        // 获取操作系统的名称
        map.put("osName",osmxb.getName());
        // 获取可用处理器的数量
        map.put("cupCount", String.valueOf(osmxb.getAvailableProcessors()));

        // 初始化一个DecimalFormat实例，用于格式化数字
        DecimalFormat df = new DecimalFormat("#,##0.0");

        // 获取系统的CPU负载
        // 获取cup
        // 尝试获取系统的CPU负载。注意：此方法可能在某些系统上无法即时返回有效值，
        // 需要经过一段时间的运行后才能得到准确的CPU使用率。若始终返回0.0，请查阅JVM文档了解限制。
        double cupLoad = osmxb.getSystemCpuLoad();

        map.put("cpuLoad", df.format(cupLoad * 100));
        // 获取系统的总物理内存大小
        // 获取内存
        double totalVirtualMemory =osmxb.getTotalPhysicalMemorySize();
        map.put("memory", df.format(totalVirtualMemory / 1024 / 1024 / 1024));
        // 获取系统的可用物理内存大小，并计算使用率
        double freePhysicalMemory = osmxb.getFreePhysicalMemorySize();
        double value = freePhysicalMemory/totalVirtualMemory;
        double percentMemoryLoad = ((1-value) * 100);
        map.put("usedMemory",df.format((totalVirtualMemory-freePhysicalMemory) / 1024 / 1024 / 1024));
        map.put("percentMemory",df.format(percentMemoryLoad));

        // 获取JVM的版本
        map.put("jvmVersion",System.getProperty("java.version"));

        return new APIResponse<>(ResponeCode.SUCCESS,"查询成功",map);
    }

    @GetMapping("/count")
    public APIResponse count(){

        Map<String,Object> map =new HashMap<>();

        //热门
        List<Object> popularThings = overviewMapper.getPopularThing();
        map.put("popularThings",popularThings);

        //热门分类
        List<Object> popularClassification = overviewMapper.getPopularClassification();
        map.put("popularClassification",popularClassification);

        //网站流量
        List<Object> visitList = new ArrayList<>();
        List<String> sevenList = getSevenDate();
        for (String day : sevenList) {
            Map<String, String> visitMap = new HashMap<>();
            visitMap.put("day",day);
            int pv = 0; //浏览量
            int uv = 0; //用户量
            List<VisitData> webVisitData = overviewMapper.getWebVisitData(day);
            for (VisitData visitData : webVisitData) {
                pv+=visitData.count;
            }
            uv=webVisitData.size();
            visitMap.put("pv", String.valueOf(pv));
            visitMap.put("uv", String.valueOf(uv));
            visitList.add(visitMap);
        }
        map.put("visitList",visitList);

        return new APIResponse<>(ResponeCode.SUCCESS,"查询成功",map);
    }

    private static List<String> getSevenDate() {
        List<String> dataList = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        for (int i = 0; i < 7; i++) {
            Date date = DateUtils.addDays(new Date(),-i);
            String formatDate = sdf.format(date);
            dataList.add(formatDate);
        }
        Collections.reverse(dataList);
        return dataList;
    }
}

